Date		:	24 aout 1991
		Protection	:	MOT DE PASSE ( manivelle )
		Programme	:       GEISHA 
		Outils		:	SOFT-ICE V2.50
		Fichier		:	FRED7.COM	
		Temps pass�	:	2h d�j�
		Soci�t�		:	INFERENCE M.D.O.
		Divers	        :	D�j� essay� plusieurs fois.
		Origine		:	Mr FRERE
		Num�ro		:	136


	Ayant r�ussi � craquer les protections sur LEGEND OF DJEL et PARIS
	DAKAR 90 je me suis mis � chercher la m�me chaine dans GEISHA et
	COUGAR FORCE. 
	On les trouve quoique un peu diff�rentes et � des endroits differents 
	mais le traitement est le m�me.
	Dans COUGAR FORCE il suffit de continuer par F10 pour tomber dessus.
	Pour GEISHA la routine a �t� plac�e dans un sous programme; apr�s avoir
	choisi la couleur et tap� sur ENTER on poursuit par F10 jusqu'� un RETF,
	� partir de l� on execute quelques call far avec F10 puis on tombe sur
	un CALL 4D98 qui lui contient un autre call; le CALL 000A dans lequel se
	trouve la routine de test en 0FFF:0046. Une chose curieuse c'est que
	cette routine est dupliqu�e en m�moire trois ou quatre fois.

	 Je pense ajouter � mon HEXUTIL une fonction qui me chercherait
	quelque chose " qui ressemble  � ". Le probl�me c'est qu'au point de
	vu programmation cel� a l'air d'�tre un vrai casse-t�te car comment
	programmer des " � peu pr�s " ou bien " du genre de " ?

	Ces deux programmes ont �t� compact� avec LZ90 de FABRICE BELLARD et
	devinez quoi ? ...une fois d�compact�s ils ne fonctionnent plus; pire
	que �a ils plantent tout m�me SOFT-ICE qui se trouve en mode prot�g� !
	Je vais �tre oblig� d'�crire � FABRICE BELLARD pour lui demander
	conseil... 

	Ci dessous la chaine de COUGAR FORCE:

	CS=0FF7
	CS:09FE C45EF8		LES	BX,[BP-08]
	CS:0A01 268A07		MOV	AL,ES:[BX] ; MOV BYTE PTR ES:[BX],40
	CS:0A04 B400		MOV	AH,00        �����������������������
	CS:0A06 257000		AND	AX,0070	
	CS:0A09 B104		MOV	CL,04	
	CS:0A0B D3F8		SAR	AX,CL	
	CS:0A0D C45EF4		LES	BX,[BP-0C]
	CS:0A10 268A17		MOV	DL,ES:[BX] ; MOV BYTE PTR ES:[BX],04
	CS:0A13 B600		MOV	DH,00        �����������������������
	CS:0A15 3BC2		CMP     AX,DX   
	CS:0A17 741C		JZ	0A35	   ; JMP 0A35	
	CS:0A19 B8FFFF		MOV	AX,FFFF      �������� 
	CS:0A1C 50		PUSH	AX

	* Soulign�: A MODIFIER.

	La chaine de GEISHA:

	CS:0FFF
	CS:0046 C45EFC		LES	BX,[BP-04]
	CS:0049 268A07		MOV	AL,ES:[BX] 
	CS:004C B400		MOV	AH,00      
	CS:004E 257000		AND	AX,0070	
	CS:0051 B104		MOV	CL,04	
	CS:0053 D3F8		SAR	AX,CL	
	CS:0055 C45EF8		LES	BX,[BP-08]
	CS:0058 268A17		MOV	DL,ES:[BX] 
	CS:005B B600		MOV	DH,00      
	CS:005D 3BC2		CMP     AX,DX   
	CS:005F 741C		JZ	0071	   
	CS:005F B8FFFF		MOV	AX,FFFF    

	En effectuant les modifications suivantes le soft fonctionne;

	
	CS:0046 C45EFC		LES	BX,[BP-04]
	CS:0049 26C60740	MOV	BYTE PTR ES:[BX],40	*	 
	CS:004D C45EF8		LES	BX,[BP-08]		*	
	CS:0050 26C60704	MOV	BYTE PTR ES:[BX],04	* 
	CS:0054 EB27		JMP	0071			*
	  :
	  :
	  :	; Les instructions suivantes n'ont plus d'importance.

	'*' signifie � modifier.			

	Ne pouvant pas d�comprimer ces programmes pour l'instant, la protection
	reste en place. Il y a bien la solution du " DETOURNEMENT D'INT " mais
	cette derni�re est relativement compliqu�e dans ce cas l� puisqu'il
	ne s'agit plus de modifier un ou deux octets mais toute une chaine.
	Je vais voir ce que je peux faire....
	Quelques heures plus tard... je d�cide d'essayer malgr� tout le d�tour-
	nement de l'IT 21. En lan�ant le soft avec QUAID je vois que la sous-
	fonction 3D de l'INT 21 est appel�e plus d'une dizaine de fois et ceci
	"pr�s" de la demande du code. Plus l'INT est proche du code plus j'ai
	des chances que la routine � modifier soit d�j� en place et moins 
	j'aurais � empiler la pile pour trouver le segment qui comporte la
	routine � modifier.
	J'inclus ci-dessous uniquement la partie active de fred7.com en laissant
	de cot� la partie commune � l'installation du soft en r�sident;
	ce dernier est le m�me pour tout les fred.com.

 ;	PATCH POUR LE PROGRAMME GEISHA
 ;	FREDDY_SOFT

 code      segment
           org    100h
           assume cs:code

 start:    jmp    installe	; On va installer la routine r�sidente...

 cr        equ    0dh
 lf        equ    0ah
 flag      equ    3Dh    ; Contenu de AH devant �tre test�.
 adr_ip    equ    3DC9h  ; En CS:3DC9 il faut avoir 268A

 instok    db     cr,lf,'    D�tournement de l',39,'INT 21 sous-fonction 3D'
	   db     cr,lf
	   db     '                  ....FREDDY_SOFT....','$'
 drap      db     0,0
 elimine   db     cr,lf,'J',39,'ai en principe tout remis en l',39,'�tat....'
	   db     cr,lf,'$'
 chaine    dw     7c6h,0c440h,0f85eh,0c626h,407h,27ebh

 int21     label  dword	; sauvegarde des adresses SEG:OFF de l'INT21 d'origine
 i40off    db     0,0	; OFFSET
 i40seg    db     0,0	; SEGMENT

 tsrint40  proc   far
           jmp short apr�s_id
	   db    'FR'	; On intercalle au d�but du code un identificateur
 apr�s_id: pushf	; qui permettra de savoir si le programme est l� !
	   push ds	; Tous les registres utilis�s doivent �tre sauv�s...
	   push es
	   push di
	   push si
	   push dx
           push cx
	   push bx
	   push ax
	   cmp byte ptr [drap],1	; Si 1 on devient transparent.
	   jz suite	; Saut � l'INT 21 toutes fonctions valid�es.
	   cmp ah,flag	; AH = 3D.
	   jnz suite	; Si non on traite les INT 21 normalement.
	   mov dx,sp	; On sauve SP dans un registre, ici AX.
	   mov cx,20	; On essaie une vingtaine de fois...
incr:      pop ds	; Pour trouver le bon segment CS...
           dec cx
	   jz s  	; Si au bout de vingt fois on a pas r�ussi on sort...
	   cmp word ptr ds:[adr_ip],8A26h
           jnz incr
; Ci-dessous deux versions possibles:
;
;	1) Une not�e RO qui est efficace pour de longues chaines:
           mov ax,ds		; RO  On place DS en ES puisque STOSW charge en
	   mov es,ax		; RO  ES:DI.
           mov ax,cs		; RO  Et CS en DS puisque les donn�es sont LODSW
           mov ds,ax		; RO  de DS:SI.
	   mov si,offset chaine	; RO  pointe sur d�but de chaine.
	   mov di,[adr_ip+1]	; RO  pointe sur d�but chaine � modifier ( CS ).
	   mov cx,6		; RO  six mots � transf�rer.
           cld			; RO  zero dans le flag direction ( incr�mente )
boucle:    lodsw		; RO  contenu de SI en AX.
	   stosw		; RO  contenu de AX en [DI].
	   loop boucle		; RO  on tourne tant que CX # 0.

;	2) Une autre qui est inactive en ce moment et qui est utilisable pour
; 	   des longueurs inf�rieures � une dizaine de mots. ( et plus simple...)

;	   mov bx,[adr_ip+1]
;          mov word ptr [bx],07c6h
;          add bx,2;
;	   mov word ptr [bx],0c440h
;	   add bx,2
;	   mov word ptr [bx],0f85eh
;	   add bx,2
;	   mov word ptr [bx],0c626h
;	   add bx,2
;	   mov word ptr [bx],0407h
;	   add bx,2
;	   mov word ptr [bx],27ebh
	   mov byte ptr [drap],1h
s:         mov sp,dx	; On remet SS:SP d'origine.
suite:	   pop ax	; On restaure tous les registres
	   pop bx
	   pop cx
	   pop dx
	   pop si
	   pop di
	   pop es
	   pop ds 
	   popf	
 	   jmp   int21	; Appel de l'INT21 officielle. ( Retour par IRET )
 tsrint40  endp
 eor: